/**
  * Author: Mei
  * Date: 2020-12-30 19:13
  * Description: &&的总结如下
  *
  * 1、左值和右值是独立于它们的类型的，右值引用类型可能是左值也可能是右值
  * 2、auto&&或函数参数类型自动推导的T&&是一个未定的引用类型，被称为universal references,
  *         它可能是左值引用也可能是右值引用类型，取决于初始化的值类型。
  * 3、所有的右值引用叠加到右值引用上仍然是一个右值引用，其他引用叠加都为左值引用。
  *         当T&&为模板参数时，输入左值，它会变成左值引用，而输入右值时则变成具名的右值引用。
  * 4、编译器会将已命名的右值引用视为左值，而将未命名的右值引用视为右值。
  *
  */
#include "head.h"

int g_constructCount = 0;
int g_copyConstructCount = 0;
int g_destoryConstructCount = 0;

struct A {
    A() {
        cout << "construct: " << ++g_constructCount << endl;
    }

    A(const A &a) {
        cout << "copy construct: " << ++g_copyConstructCount << endl;
    }

    ~A() {
        cout << "destory construct: " << ++g_destoryConstructCount << endl;
    }

};

A GetA() {
    return A();
}

template<typename T>
void f(T&& param) {
    cout << param << endl;
}
int main() {
    A a = GetA();  //编译器做了好多优化

    f(10);
    int x = 10;
    f(x);

    cout << typeid(A*[10]).name() << endl;

    return 0;
}